/******************************************************************************\
 *                                                                              *
 *     File: Dierentuin_test.cpp                                                *
 *                                                                              *
 *   Author: Douwe A. van Twillert                                              *
 *  Purpose: test van de klasse Dierentuin                                      *
 *  Version: 1.0      TWI 20080218                                              *
 *           - Initial version                                                  *
 *                                                                              *
\******************************************************************************/

#include <string>

#include "TestSet.hpp"

#include "Dierentuin.h"


TEST_SET(DierentuinTesten);


TEST(DierentuinConstructorTestGood1)
Dierentuin* artis = new Dierentuin("Artis");

CHECK(artis != 0);

delete artis;
END_TEST


TEST(DierentuinConstructorTestFailure2)
Dierentuin* artis = new Dierentuin("");

delete artis;
END_TEST


TEST(DierentuinConstructorTest4)
Dierentuin* dierentuin = new Dierentuin("this is a very long name "
        "but that stil must be no problem"
        "no matter how long is should become"
        );

CHECK(dierentuin != 0);

delete dierentuin; // delete 0 is defined as no harm done
END_TEST


TEST(DierentuinGetName1)
Dierentuin* dierentuin = new Dierentuin("x");

CHECK(dierentuin != 0);

string naam = dierentuin->getNaam();
string lege_naam = "";

CHECK(naam.compare(lege_naam) != 0);

delete dierentuin; // delete 0 is defined as no harm done
END_TEST



TEST_SET(DierentuinMethodsTests)


TEST(DierentuinGetNameTestGood1)
const char* name = "a name";
Dierentuin* dierentuin = new Dierentuin(name);
string a_name = "";

CHECK(dierentuin != 0);
a_name = dierentuin->getNaam();
CHECK(a_name.compare(name) == 0);

delete dierentuin;
END_TEST


TEST(DierentuinGetNameTestGood2)
const char* name = "this is a very long name "
"but that stil must be no problem"
"no matter how long is should become";

Dierentuin* dierentuin = new Dierentuin(name);

CHECK(dierentuin != 0);
CHECK(dierentuin->getNaam() == name);
CHECK(dierentuin->getNaam().compare(name) == 0);

delete dierentuin;
END_TEST

TEST(DierentuinGetLaagsteBeschikbareNummerGood1)
int nr;
string optie = "dier";

Dierentuin* dierentuin = new Dierentuin("Test");
dierentuin->dierToevoegen("henk", 54);
nr = dierentuin->getLaagsteBeschikbareNummer(optie);

CHECK(nr == 2);

delete dierentuin;

END_TEST

TEST(DierentuinGetLaagsteBeschikbareNummerGood2)
int nr;
string optie = "werknemer";
string categorie = "administrateur";

Dierentuin* dierentuin = new Dierentuin("Test");
dierentuin->werknemerToevoegen("henk", 54, categorie);
dierentuin->werknemerToevoegen("jaap", 17, categorie);
nr = dierentuin->getLaagsteBeschikbareNummer(optie);

CHECK(nr == 3);

delete dierentuin;

END_TEST

TEST(DierentuinGetLaagsteBeschikbareNummerFail1)

int nr;
string optie = "blabla";

Dierentuin* dierentuin = new Dierentuin("Test");
nr = dierentuin->getLaagsteBeschikbareNummer(optie);

CHECK(nr == -1);

delete dierentuin;

END_TEST

TEST(DierentuinGetLaagsteBeschikbareNummerFail2)

int nr;
string optie = "";

Dierentuin* dierentuin = new Dierentuin("Test");
nr = dierentuin->getLaagsteBeschikbareNummer(optie);

CHECK(nr == -1);

delete dierentuin;

END_TEST

TEST(DierentuinWerknemerToevoegenGood1)
string naam = "Henk";
int leeftijd = 54;
string categorie = "administrateur";
Dierentuin* dierentuin = new Dierentuin("Test");

dierentuin->werknemerToevoegen(naam, leeftijd, categorie);
CHECK(dierentuin->getWerknemer(1)->getNaam() == naam);

delete dierentuin;
END_TEST

TEST(DierentuinWerknemerToevoegenGood2)
string naam = "Barry";
int leeftijd = 16;
string categorie = "administrateur";
Dierentuin* dierentuin = new Dierentuin("Test");

dierentuin->werknemerToevoegen(naam, leeftijd, categorie);
CHECK(dierentuin->getWerknemer(1)->getNaam() == naam);

delete dierentuin;
END_TEST

//TEST(DierentuinWerknemerToevoegenFail1)
//string naam = "Barry";
//int leeftijd = 15;
//string categorie = "administrateur";
//Dierentuin* dierentuin = new Dierentuin("Test");
//
//EXPECT_SYSTEM_ASSERTION_FAILED;
//dierentuin->werknemerToevoegen(naam, leeftijd, categorie);
//EXPECT_NOT_REACHED;
//
//
//delete dierentuin;
//END_TEST

//TEST(DierentuinWerknemerToevoegenFail2)
//string naam = "";
//int leeftijd = -1;
//string categorie = "administrateur";
//Dierentuin* dierentuin = new Dierentuin("Test");
//
//EXPECT_SYSTEM_ASSERTION_FAILED;
//dierentuin->werknemerToevoegen(naam, leeftijd, categorie);
//EXPECT_NOT_REACHED;
//
//
//delete dierentuin;
//END_TEST

TEST(DierentuinDierToevoegenGood1)
string naam = "varken";
int leeftijd = 3;
Dierentuin* dierentuin = new Dierentuin("Test");

dierentuin->dierToevoegen(naam, leeftijd);
CHECK(dierentuin->getDier(1) != 0);

delete dierentuin;
END_TEST

TEST(DierentuinDierToevoegenGood2)
string naam = "Koe";
int leeftijd = 24;
Dierentuin* dierentuin = new Dierentuin("Test");

dierentuin->dierToevoegen(naam, leeftijd);
CHECK(dierentuin->getDier(1) != 0);

delete dierentuin;
END_TEST

//TEST(DierentuinDierToevoegenFail)
//string naam = "Paard";
//int leeftijd = -1;
//Dierentuin* dierentuin = new Dierentuin("Test");
//
//EXPECT_SYSTEM_ASSERTION_FAILED;
//dierentuin->dierToevoegen(naam, leeftijd);
//EXPECT_NOT_REACHED;
//
//
//delete dierentuin;
//END_TEST

TEST(DierentuinDierVerwijderenGood)
string naam = "Koe";
int leeftijd = 24;
Dierentuin* dierentuin = new Dierentuin("Test");

dierentuin->dierToevoegen(naam, leeftijd);
CHECK(dierentuin->getDier(1) != 0);

dierentuin->dierVerwijderen(1);

CHECK(dierentuin->getDier(1) == 0);

delete dierentuin;
END_TEST
//
//TEST(DierentuinDierVerwijderenFail)
//string naam = "Paard";
//int leeftijd = 3;
//Dierentuin* dierentuin = new Dierentuin("Test");
//
//dierentuin->dierToevoegen(naam, leeftijd);
//CHECK(dierentuin->getDier(1) != 0);
//
//EXPECT_SYSTEM_ASSERTION_FAILED;
//dierentuin->dierVerwijderen(0);
//EXPECT_NOT_REACHED;
//
//
//delete dierentuin;
//END_TEST

TEST(DierentuinWerknemerVerwijderenGood)
string naam = "Henk";
int leeftijd = 54;
string categorie = "administrateur";
Dierentuin* dierentuin = new Dierentuin("Test");

dierentuin->werknemerToevoegen(naam, leeftijd, categorie);
CHECK(dierentuin->getWerknemer(1) != 0);

dierentuin->werknemerVerwijderen(1);

CHECK(dierentuin->getWerknemer(1) == 0);

delete dierentuin;
END_TEST

//TEST(DierentuinWerknemerVerwijderenFail)
//string naam = "Henk";
//int leeftijd = 54;
//string categorie = "administrateur";
//Dierentuin* dierentuin = new Dierentuin("Test");
//
//dierentuin->werknemerToevoegen(naam, leeftijd, categorie);
//CHECK(dierentuin->getWerknemer(1) != 0);
//
//EXPECT_SYSTEM_ASSERTION_FAILED;
//dierentuin->werknemerVerwijderen(0);
//EXPECT_NOT_REACHED;
//
//
//delete dierentuin;
//END_TEST

TEST(DierentuinKooiToevoegenGood)
string diersoort = "koala's";
Dierentuin* dierentuin = new Dierentuin("Test");
dierentuin->kooiToevoegen(diersoort);

CHECK(dierentuin->getKooien()->count(diersoort) == 1);

delete dierentuin;
END_TEST

TEST(DierentuinManagerToevoegenOndergeschikten)
        
Dierentuin* dierentuin = new Dierentuin("Test");
Werknemer* henk = new Administrateur("henk", 54);
Werknemer* piet = new Administrateur("piet", 54);
Werknemer* jan = new Administrateur("jan", 54);
Manager* baas = new Manager("baas", 66, new list<Werknemer*>());

baas->addOndergeschikte(henk);
CHECK(baas->getOndergeschikten()->size() == 1);

baas->addOndergeschikte(piet);
CHECK(baas->getOndergeschikten()->size() == 2);


delete henk;
delete piet;
delete jan;
delete baas;
delete dierentuin;

END_TEST
        
TEST(DierentuinSalarisPost)
Dierentuin* dierentuin = new Dierentuin("Test");
Kooi* kooi = new Kooi("varkens");
Werknemer* henk = new Administrateur("henk", 20);

Werknemer* piet = new Oppasser("piet", 40, kooi);
Werknemer* jan = new Administrateur("jan", 40);
CHECK(jan->getSalaris()==12000);
Manager* baas = new Manager("baas", 30, new list<Werknemer*>());

dierentuin->werknemerToevoegen(henk);
dierentuin->werknemerToevoegen(piet);
dierentuin->werknemerToevoegen(jan);
baas->addOndergeschikte(henk);
dierentuin->werknemerToevoegen(baas);

cout << "Salarispost (print): " << dierentuin->getSalarisPost() << endl << endl;

CHECK( dierentuin->getSalarisPost() == 148000);

delete dierentuin;

END_TEST


int main() {
    return TestSet_execute();
}
